PHP: перебор диапазона дат

Нашел еще один способ перебора каждого дня в диапазоне дат. Вот такой:

$start = new DateTime('2026-01-01');
$interval = new DateInterval('P1D'); // Интервал в 1 день
$period = new DatePeriod($start, $interval, new DateTime('2026-05-21'));

foreach ($period as $date) {
echo $date->format('Ymd')."\n";
}

Ну соответственно в DateInterval можно вставлять не только интервал день (или несколько), но и неделя, месяц, год:

  • y— Количество лет
  • m— Количество месяцев
  • d — Количество дней.
  • h — Количество часов.
  • i — Количество минут.
  • s — Количество секунд.
  • f — Количество микросекунд в виде долей секунды.

1С: Группировка в макете

Для того чтобы при выводе макета отображалась группировка, её собственно сначала нужно включить:

ТабДок=Новый ТабличныйДокумент;	
ТабДок.НачатьАвтогруппировкуСтрок();		
....
// Заполняем табличный документ
....
ТабДок.ЗакончитьАвтогруппировкуСтрок();
ТабДок.ОтображатьГруппировки = Истина;
ТабДок.ПоказатьУровеньГруппировокСтрок(3);

В конце указывается уровень группировки по умолчанию. А как дать понять к какому уровню группировки относится конкретный вывод в табличную часть? Всё решается параметрами вида:

ТабДок.Вывести(ОбластьТушка,<уровнь группировки>,<название группы>,<Истина/Ложь - раскрыто/свернуто по умолчанию>);   		  					

1C:невозможно применить фиксированные настройки пересекаются элементы отбора

Эта ошибка может появляться, если при открытии формы списка задаётся «жесткий» отбор, который конфликтует с пользовательским отбором (выбран тот-же отбор, что и «принудительный»). Я решил эту проблему следующим образом: при открытии формы читаю пользовательские отборы, и если вижу что его отбор тот же что и назначаемый, назначаемый отключаю и вывожу сообщение о конфликте:

&НаСервере
Функция ПОлучитьОтборы()
	возврат Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();		
КонецФункции

&НаКлиенте
Процедура ПриОткрытии(Отказ)
ВывестиПредупреждение=ложь;
	ОтборыПользователя=	ПОлучитьОтборы();
	для каждого эл из ОтборыПользователя.Отбор.Элементы цикл
		если эл.ЛевоеЗначение="ТО_КО" тогда
			ВывестиПредупреждение=истина;
		конецесли;
	конеццикла;	
	если ВывестиПредупреждение=ложь тогда
		Список.Отбор.Элементы.Очистить();		
		Отбор = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));    
		Отбор.ЛевоеЗначение = Список.Отбор.ДоступныеПоляОтбора.Элементы.Найти("ТО_КО").Поле;    
		Отбор.ПравоеЗначение =ЭтаФорма.Подразделение;	
		Отбор.Использование=Истина;	
		Отбор.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;				
	иначе
		Сообщить("ВНИМАНИЕ! У вас конфликт отборов. Снимите галочку с отбора ТО_КО");	
	конецесли;

	//ПодключитьОбработчикИзмененияДанных("ДокументСписок.Отбор", "ПосчитатьИтогиНаСервере", Истина);	
	ПодключитьОбработчикОжидания("ПосчитатьИтогиНаКлиенте",3,ложь);
	
КонецПроцедуры

Преобразование сертификата для подписи ГИС ЖКХ

Дано: флешка с сертификатом для подписи сообщений для ГИС ЖКХ,

Задача: выдернуть с рутокена контейнер в формате p12 и расчленить его на сертификат+открытый ключ+закрытый ключ. Задачу уже подобную год назад решал, но как оказалось мануал который сам для себя тогда делал немножко не точный. Потому обновлю.

Решение:

  1. Для получения файла с токена необходимо воспользоваться P12FromGostCSP
  2. Сертификат: openssl pkcs12 -in p12.pfx -clcerts -nokeys -out public.crt
  3. Публичный ключ: openssl x509 -in public.crt -out public.pem -outform PEM
  4. Закрытый ключ без пароля: openssl pkcs12 -in p12.pfx -nocerts -out key.pem -nodes

Javascript: формирование csv файла

Задача: на чистом javascript сформировать и сохранить из браузера файл формата csv, адекватно открывающийся табличным редактором (например OnlyOffice)

Решение:

rows=[];
rows.push(["aa","bb"]);

let csvContent = "data:text/csv;charset=utf-8," + rows.map(e => e.join(",")).join("\n");
var encodedUri = encodeURI(csvContent);
var link = document.createElement("a");
link.setAttribute("href", encodedUri);
link.setAttribute("download", "download.csv");
document.body.appendChild(link); 
link.click();

Что тут происходит: заполняется некий массив, далее создаётся ссылка в DOM, и в элемент ссылки записываются данные массива. Далее эмулируется нажатие собственно на эту ссылку.

1 2 3 316